console.log('script start')

// 宏任务
setTimeout(() => {
    console.log('setTimeout')
}, 0)


// 微任务 跟在当前宏任务后面
new Promise((resolve) => {
    console.log('new Promise')
    resolve()
    console.log('promise body')
}).then(() => {
    console.log('promise.then 1')
}).then(() => {
    console.log('promise.then 2')
})

console.log('script end')


// eg: 2
let a = () => {
    setTimeout(() => {
        console.log('任务队列函数1')
    }, 0)
    for (let i = 0; i < 5; i++) {
        console.log('a的for循环')
    }
    console.log('a事件执行完')
}
let b = () => {
    setTimeout(() => {
        console.log('任务队列函数2')
    }, 0)
    for (let i = 0; i < 5; i++) {
        console.log('b的for循环')
    }
    console.log('b事件执行完')
}
let c = () => {
    setTimeout(() => {
        console.log('任务队列函数3')
    }, 0)
    for (let i = 0; i < 5; i++) {
        console.log('c的for循环')
    }
    console.log('c事件执行完')
}
a();
b();
c();

// 执行顺序问题，考察频率挺高的，先自己想答案**
setTimeout(function() {
    console.log(1);
});
new Promise(function(resolve, reject) {
    console.log(2)
    resolve(3)
}).then(function(val) {
    console.log(val);
})
console.log(4);

// 先执行script同步代码
// 先执行new Promise中的console.log(2),then后面的不执行属于微任务
// 然后执行console.log(4)
// 执行完script宏任务后，执行微任务，console.log(3)，没有其他微任务了。
// 执行另一个宏任务，定时器，console.log(1)。
// 根据本文的内容，可以很轻松，且有理有据的猜出写出正确答案：2,4,3,1.